<?php

namespace AdminModule;

class TaskPresenter extends \BasePresenter
{

	public function renderDefault()
	{
		$taskModel = $this->context->models->tasks;
		$this->template->tasks = $taskModel->getTasks();
	}

	public function renderAddTaskSelectProject()
	{
		$projectsModel = $this->context->models->projects;
		$this->template->projects = $projectsModel->getAllProjects();
	}


	public function renderAddTask($id)
	{
		$this->template->project = $id;
	}

	public function renderEditTask($id)
	{
		$this->template->taskID = $id;
	}

	/** @secured */
	public function handleDeleteTask($id)
	{
		$taskModel = $this->context->models->task;
		if ($taskModel->find($id)->getTask()->delete())
		{
			$this->flashMessage('Úkol byl úspěšně smazán.');
		} else
		{
			$this->flashMessage('Chyba při mazání úkolu. Úkol nelze smazat pokud jsou k němu přiloženy soubory či napsány komentáře.', 'error');
		}
		$this->redirect('this');
	}

	public function renderPriorities()
	{
		$priorityModel = $this->context->models->taskContext;
		$this->template->priorities = $priorityModel->getPriorities();
	}

	public function renderEditPriority($id)
	{
		$priorityModel = $this->context->models->taskContext;
		$priority = $priorityModel->getPriority(array('id' => $id));
		$this['editPriorityForm']->setValues($priority);
		$this->template->priority = $priority['name'];
	}

	/** @secured */
	public function handleDeletePriority($id)
	{
		$priorityModel = $this->context->models->taskContext;
		if ($priorityModel->deletePriority($id))
		{
			$this->flashMessage('Priorita byla úspěšně smazána.');
		} else
		{
			$this->flashMessage('Chyba při mazání priority. Prioritu nelze smazat, pokud existuje úkol s touto prioritou.', 'error');
		}
		$this->redirect('this');
	}

	public function renderStatuses()
	{
		$statusModel = $this->context->models->taskContext;
		$this->template->statuses = $statusModel->getStatuses();
	}

	public function renderEditStatus($id)
	{
		$statusModel = $this->context->models->taskContext;
		$status = $statusModel->getStatus(array('id' => $id));
		$this->template->status = $status['name'];
		$prioritites = $this['editStatusForm']['priority']->getItems();
		unset($prioritites[$status['priority']]);
		$this['editStatusForm']['priority']->setItems($prioritites);
		$values = iterator_to_array($status);
		$values['priority']--;
		$values['completed'] = ($values['completed'] === 'yes' ? true : false);
		$this['editStatusForm']->setValues($values);
	}

	/** @secured */
	public function handleDeleteStatus($id)
	{
		$statusModel = $this->context->models->taskContext;
		if ($statusModel->deleteStatus($id))
		{
			$this->flashMessage('Stav úkolu byl úspěšně smazán.');
		} else
		{
			$this->flashMessage('Chyba při mazání stavu úkolu. Stav úkolu nelze smazat, pokud existuje úkol s tímto stavem.', 'error');
		}
		$this->redirect('this');
	}
	
	public function renderTypes()
	{
		$taskContextModel = $this->context->models->taskContext;
		$this->template->types = $taskContextModel->getTypes();
	}

	public function renderEditType($id)
	{
		$taskContextModel = $this->context->models->taskContext;
		$type = $taskContextModel->getType(array('id' => $id));
		$this['editTypeForm']->setValues($type);
		$this->template->type = $type['name'];
	}

	/** @secured */
	public function handleDeleteType($id)
	{
		$priorityModel = $this->context->models->taskContext;
		if ($priorityModel->deleteType($id))
		{
			$this->flashMessage('Typ úkolu byl úspěšně smazán.');
		} else
		{
			$this->flashMessage('Chyba při mazání typu úkolu. Typ úkolu nelze smazat, pokud existuje úkol tohoto typu.', 'error');
		}
		$this->redirect('this');
	}

	protected function createComponentTaskForm()
	{
		$taskForm = new \Tasker\Components\Forms\TaskForm();
		$taskForm->setRedirect($this->link('Task:default'));
		return $taskForm;
	}

	protected function createComponentAddPriorityForm($name)
	{
		$form = new \Nette\Application\UI\Form($this, $name);
		$form->addText('name', 'Název:');
		$priorities = range(0, 10);
		unset($priorities[0]); // 1..10
		$form->addSelect('priority', 'Váha:', $priorities);
		$form->addSubmit('save', 'Uložit');
		$form->onSuccess[] = callback($this, 'addPriority');
		return $form;
	}

	protected function createComponentEditPriorityForm($name)
	{
		$form = new \Nette\Application\UI\Form($this, $name);
		$form->addText('name', 'Název:');
		$priorities = range(0, 10);
		unset($priorities[0]); // 1..10
		$form->addSelect('priority', 'Váha:', $priorities);
		$form->addSubmit('save', 'Uložit');
		$form->addHidden('id');
		$form->onSuccess[] = callback($this, 'editPriority');
		return $form;
	}

	public function addPriority($form)
	{
		$values = $form->getValues();
		$priorityModel = $this->context->models->taskContext;
		if ($priorityModel->addPriority($values))
		{
			$this->flashMessage('Priorita byla úspěšně přidána.');
			$this->redirect('Task:priorities');
		} else
		{
			$this->flashMessage('Chyba při vkládání priority.', 'error');
		}
	}

	public function editPriority($form)
	{
		$values = $form->getValues();
		$priorityModel = $this->context->models->taskContext;
		if ($priorityModel->editPriority($values) !== false)
		{
			$this->flashMessage('Priorita byla úspěšně upravena.');
			$this->redirect('Task:priorities');
		} else
		{
			$this->flashMessage('Chyba při úpravě priority.', 'error');
		}
	}

	protected function createComponentAddTypeForm($name)
	{
		$form = new \Nette\Application\UI\Form($this, $name);
		$form->addText('name', 'Název:');
		$form->addSubmit('save', 'Uložit');
		$form->onSuccess[] = callback($this, 'addType');
		return $form;
	}

	protected function createComponentEditTypeForm($name)
	{
		$form = new \Nette\Application\UI\Form($this, $name);
		$form->addText('name', 'Název:');
		$form->addSubmit('save', 'Uložit');
		$form->addHidden('id');
		$form->onSuccess[] = callback($this, 'editType');
		return $form;
	}

	public function addType($form)
	{
		$values = $form->getValues();
		$priorityModel = $this->context->models->taskContext;
		if ($priorityModel->addType($values))
		{
			$this->flashMessage('Typ úkolu byl úspěšně přidán.');
			$this->redirect('Task:types');
		} else
		{
			$this->flashMessage('Chyba při vkládání typu úkolu.', 'error');
		}
	}

	public function editType($form)
	{
		$values = $form->getValues();
		$priorityModel = $this->context->models->taskContext;
		if ($priorityModel->editType($values) !== false)
		{
			$this->flashMessage('Typ úkolu byl úspěšně upraven.');
			$this->redirect('Task:types');
		} else
		{
			$this->flashMessage('Chyba při úpravě typu úkolu.', 'error');
		}
	}

	public function createComponentAddStatusForm($name)
	{
		$statusModel = $this->context->models->taskContext;
		$priorities = array(0 => '# Začátek #');
		foreach ($statusModel->getStatuses() as $status)
		{
			$priorities[$status['priority']] = $status['name'];
		}
		$form = new \Nette\Application\UI\Form($this, $name);
		$form->addText('name', 'Název:')->setRequired('Vyplňte prosím název role');
		$form->addSelect('priority', 'Zařadit za:', $priorities);
		$form->addCheckbox('completed','Úkol je dokončený');
		$form->addSubmit('send', 'Uložit');
		$form->onSuccess[] = callback($this, 'addStatus');
		return $form;
	}

	public function createComponentEditStatusForm($name)
	{
		$statusModel = $this->context->models->taskContext;
		$priorities = array(0 => '# Začátek #');
		foreach ($statusModel->getStatuses() as $status)
		{
			$priorities[$status['priority']] = $status['name'];
		}
		$form = new \Nette\Application\UI\Form($this, $name);
		$form->addText('name', 'Název:')->setRequired('Vyplňte prosím název stavu');
		$form->addSelect('priority', 'Zařadit za:', $priorities);
		$form->addCheckbox('completed','Úkol je dokončený');
		$form->addHidden('id');
		$form->addSubmit('send', 'Uložit');
		$form->onSuccess[] = callback($this, 'editStatus');
		return $form;
	}

	public function addStatus($form)
	{
		$values = $form->getValues();
		$statusModel = $this->context->models->taskContext;
		if ($statusModel->addStatus($values))
		{
			$this->flashMessage('Stav byl úspěšně přidán');
			$this->redirect('statuses');
		} else
		{
			$this->flashMessage('Chyba! Tento stav již existuje', 'error');
		}
	}

	public function editStatus($form)
	{
		$values = $form->getValues();
		$statusModel = $this->context->models->taskContext;
		if ($statusModel->editStatus($values) !== false)
		{
			$this->flashMessage('Stav byl úspěšně upraven');
			$this->redirect('statuses');
		} else
		{
			$this->flashMessage('Chyba při úpravě stavu!', 'error');
		}
	}

}